#ifndef FILELISTORDERMANAGER_H
#define FILELISTORDERMANAGER_H

#include <QObject>
#include <QList>
#include <QString>
#include <QHash>
#include "unifiedfileinfo.h"
#include "layoutstatemanager.h"
#include "filelistindex.h"

/**
 * FileListOrderManager - Extract Class Refactoring
 *
 * Martin Fowler重构模式应用：
 * - 将排序逻辑从CustomFileListWidget中提取
 * - 提供稳定的文件顺序管理
 * - 确保拖拽和布局变更后的一致性
 */
class FileListOrderManager : public QObject
{
    Q_OBJECT

public:
    explicit FileListOrderManager(QObject* parent = nullptr);
    ~FileListOrderManager() = default;

    // === 核心排序管理 - Martin Fowler: 使用类型安全的索引管理 ===
    void setFiles(const QList<UnifiedFileInfo>& files);
    void addFile(const UnifiedFileInfo& file);
    void removeFile(const FileListIndex& index);
    void moveFiles(const FileListIndexRange& fromIndices, const FileListIndex& toIndex);


    // === 稳定性保证 ===
    QList<UnifiedFileInfo> getStableOrderedFiles() const;
    FileListIndex mapOriginalToCurrentIndex(const FileListIndex& originalIndex) const;
    FileListIndex mapCurrentToOriginalIndex(const FileListIndex& currentIndex) const;


    // === 布局变更处理 ===
    void onLayoutChanged(const QString& fileIdentity, LayoutMode mode);
    void onBatchLayoutChanged();

    // === 状态验证 ===
    bool verifyConsistency() const;
    QString getFileIdentityAt(int index) const;

signals:
    void orderChanged();
    void consistencyIssueDetected(const QString& issue);

private:
    struct FileOrderEntry {
        UnifiedFileInfo fileInfo;
        QString stableId;          // 基于文件路径的稳定标识
        int originalOrder;         // 原始添加顺序
        qint64 lastModified;       // 最后修改时间戳

        FileOrderEntry() : originalOrder(-1), lastModified(0) {}
    };

    QList<FileOrderEntry> m_orderedFiles;
    QHash<QString, int> m_stableIdToIndex;  // 稳定ID到当前索引的映射
    int m_nextOriginalOrder;

    // === 内部方法 ===
    void rebuildIndexMaps();
    QString generateStableId(const UnifiedFileInfo& file) const;
    void maintainOrderStability();
};

#endif // FILELISTORDERMANAGER_H